# -*- coding: utf-8 -*-
import lastfm

from Settings import Settings
from Exceptions.WebFetchingException import WebFetchingException

"""
Diese Klasse liest über die lastFM-API Bilder zu Artists oder Alben ein. In den 
Settings muss der lastFM-API-Key gespeichert werden. Dieser kann über 
http://www.lastfm.de/api/account bezogen werden.

@author: Philipp Dermitzel
@date: 2011-03-31
@version: 1.2.0
"""
class LastFMFetcher(object):

    """
    ----------------------------------------------------------------------------
    Klassenvariablen
    ----------------------------------------------------------------------------
    """
    
    """
    Der lastFM-API-Key. Wird aus den Settings geholt.
    @type: String
    """
    apiKey = None
    
    """
    Die lastFM-API. Wird über den Konstruktor erzeugt.
    @type: unknown
    """
    api = None
    
    """
    Die möglichen Bildgrößen. Dies sollte mit der lastFM-API abgestimmt werden.
    @type: Array
    """
    imageSizes = ['original', 'mega', 'extralarge', 'large', 'medium', 'small']
    
    """
    Die Klassen-Instanz der programmweiten Settings.
    @type: Settings
    """
    settings = Settings()

    """
    ----------------------------------------------------------------------------
    Konstruktor
    ----------------------------------------------------------------------------
    """
    
    """
    Der Konstruktor. Wirft WebFetchingExceptions!
    Holt den lastFM-API-Key aus den Settings und erzeugt das lastFM-API-Objekt.
    """
    def __init__(self):
        try:
            LastFMFetcher.apiKey = LastFMFetcher.settings.getSetting('lastFMKey')
            LastFMFetcher.api = lastfm.Api(self.apiKey)
        except: raise WebFetchingException("""Konnte den LastFM-Key nicht 
            nachschlagen""")
    
    """
    ----------------------------------------------------------------------------
    Methoden der Klasse
    ----------------------------------------------------------------------------
    """
    
    """
    Holt zu einem gegebenen Artist das lastFM-Hauptbild. Die Größe kann 
    festgelegt werden. Wirft WebFetchingExceptions!
    @param artistName: Der Name des Artists.
    @type artistName: String
    @param size: Die zu holende Größe. Standard: 'mega'. Siehe hierbei auch 
        C(imageSizes).
    @type size: String
    @param returnOther: Wird dieser Parameter gesetzt, wird, bei 
        nicht-Vorhandensein der gewünschten Größe, das größtmögliche Bild 
        geliefert.
    @return: Die URL zum Bild.
    @rtype: String
    """        
    def getArtistImage(self, artistName, size = 'mega', returnOther = True):
        try: artist = LastFMFetcher.api.get_artist(artistName)
        except: raise WebFetchingException("""Konnte keine Informationen zum 
            Artist %s holen""" %(artistName))
        if size in LastFMFetcher.imageSizes:
            try: return artist.image[size]
            except: 
                if returnOther is True:
                    for curSize in LastFMFetcher.imageSizes:
                        try: return artist.image[curSize]
                        except: pass
                    raise WebFetchingException("Keine Bilder für %s vorhanden" 
                        %(artistName))
                else: raise WebFetchingException("""Bildgröße %s für %s nicht 
                    verfügbar""" %(size, artistName))
        else: raise WebFetchingException("Bildgröße %s nicht unterstützt" 
            %(size))
    """
    Holt zu einem gegebenen Album eines gegebenen Artists das lastFM-Hauptbild. 
    Die Größe kann festgelegt werden. Wirft WebFetchingExceptions!
    @param albumName: Der Name des Albums. 
    @type albumName: String
    @param artistName: Der Name des Artists.
    @type artistName: String
    @param size: Die zu holende Größe. Standard: 'mega'. Siehe hierbei auch 
        C(imageSizes).
    @type size: String
    @param returnOther: Wird dieser Parameter gesetzt, wird, bei 
        nicht-Vorhandensein der gewünschten Größe, das größtmögliche Bild 
        geliefert.
    @return: Die URL zum Bild.
    @rtype: String
    """            
    def getAlbumImage(self, albumName, artistName, size = 'mega', 
        returnOther = True):
        try: album = LastFMFetcher.api.get_album(albumName, artistName)
        except: raise WebFetchingException("""Konnte keine Informationen zum 
            Album %s [von %s] holen""" %(artistName, albumName))
        if size in LastFMFetcher.imageSizes:
            try: return album.image[size]
            except: 
                if returnOther is True:
                    for curSize in LastFMFetcher.imageSizes:
                        try: return album.image[curSize]
                        except: pass
                    raise WebFetchingException("""Keine Bilder für %s [von %s] 
                        vorhanden""" %(albumName, artistName))
                else: raise WebFetchingException("""Bildgröße %s für %s nicht 
                    verfügbar""" %(size, artistName))
        else: raise WebFetchingException("Bildgröße %s nicht unterstützt" 
            %(size))
